package com.culture.bootdemo.算法.sort;

import java.util.Arrays;

/**
 * 冒泡排序
 * 时间复杂度：O( n^2 )
 */
public class MaoPaoSort {
    public static void bubbleSort(Integer[] arr) {
        int n = arr.length;
        if (n <= 1) return;       //如果只有一个元素就不用排序了

        for (int i = 0; i < n; ++i) {
            // 提前退出冒泡循环的标志位,即一次比较中没有交换任何元素，这个数组就已经是有序的了
            //注：假如数组已经有序，若没有falg，则会执行一遍方法，设置flag，只遍历一遍就推出，提升效率
            boolean flag = true;
            for (int j = 0; j < n - i - 1; ++j) {        //此处你可能会疑问的j<n-i-1，因为冒泡是把每轮循环中较大的数飘到后面，
                // 数组下标又是从0开始的，i下标后面已经排序的个数就得多减1，总结就是i增多少，j的循环位置减多少
                if (arr[j] > arr[j + 1]) {        //即这两个相邻的数是逆序的，交换
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = false;//3, 2, 1, 5, 4, 2, 7, 6
                }
            }
            if (flag) break;//没有数据交换，数组已经有序，退出排序
        }
//        Arrays.stream(arr).forEach(System.out::println);
        System.out.println(Arrays.toString(arr));
    }

    public static void main(String[] args) {
        Integer[] arr = {3, 2, 1, 5, 4, 2, 7, 6};
        bubbleSort(arr);
    }


}
